package com.gict.antifraudback.utils.magnet;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gict.antifraudback.entity.MagnetFile;
import com.gict.antifraudback.service.MagnetFileService;
import com.gict.antifraudback.utils.SpringContextUtils;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 磁力引擎接口
 */
public interface IMagnet {

    public static void main(String[] args) {
        IMagnet magnet = new BTLMMagnet();
        List<MagnetFile> magnetFile = magnet.listMagnetByKeyWord("02舞蹈女孩", 1);
        for (MagnetFile file : magnetFile) {
            System.out.println(file);
        }
    }

    /**
     * 获取来源
     *
     * @return 来源
     */
    String getSource();

    /**
     * 根据关键词返回磁力对象
     *
     * @param keyword 关键词 比如 FC2
     * @return MagnetFile
     */
    MagnetFile getMagnetByKeyWord(String keyword);

    /**
     * 根据关键词返回分页的磁力对象
     *
     * @param keyword 关键词 比如 FC2
     * @return MagnetFile
     */
    List<MagnetFile> listMagnetByKeyWord(String keyword, Integer page);

    /**
     * 解析所有的子项存入列表，因为每个网站都不一样，需要子类实现
     * @param magnetFileList 返回的列表
     */
    void parseItem(Elements elements, List<MagnetFile> magnetFileList);

    default List<MagnetFile> parseAll(Document doc, CssQuery cssQuery) {
        List<MagnetFile> result = new ArrayList<>();
        // 查找所有的 列表 元素
        Elements ulElements = doc.select(cssQuery.getUlCssQuery());
        if (ulElements != null && !ulElements.isEmpty()) {
            parseItem(ulElements, result);
        }

        return result;
    }

    default Map<String, Object> parse(Element element, CssQuery cssQuery) {
        Map<String, Object> result = new HashMap<>();

        return result;
    }

    default long parseSize(String size){
        long result = 0L;

        if (ObjectUtils.isEmpty(size)){
            return result;
        }
        String[] split = size.split(" ");

        String sizeStr = split[0].trim();
        String unit = split[1].trim();

        double sizeDou = Double.parseDouble(sizeStr);

        if ("MB".equals(unit)){
            result = Math.round(sizeDou * 1024 * 1024);
        }else if ("GB".equals(unit)){
            result = Math.round(sizeDou * 1024 * 1024 * 1024);
        }else {
            result = Math.round(sizeDou * 1024);
        }
        return result;
    }

    default void saveToDb(List<MagnetFile> magnetFileList){
        if (!CollectionUtils.isEmpty(magnetFileList)) {
            MagnetFileService fileService = SpringContextUtils.getBean(MagnetFileService.class);
            for (MagnetFile magnetFile : magnetFileList) {
                MagnetFile one = fileService.getOne(Wrappers.<MagnetFile>lambdaQuery().eq(magnetFile.getMagnetLink() != null, MagnetFile::getMagnetLink, magnetFile.getMagnetLink()));
                if (one == null) {
                    fileService.save(magnetFile);
                }
            }
        }
    }

}
